from django.conf import settings
from django.contrib.auth.models import AbstractUser
from django.db import models
from itsdangerous import BadData
from itsdangerous import TimedJSONWebSignatureSerializer as TJWSSerializer

from MeiduoMall.utils.models import BaseModel
from users import constants


class User(AbstractUser):
    """用户模型类,Django认证系统(django.contrib)中提供的用户模型类,注意: 定义后需要在配置文件中替换Django提供的用户模型"""
    # 定义提供中没有的字段
    mobile = models.CharField(max_length=11, unique=True, verbose_name="手机号")
    # 添加邮箱验证状态
    email_active = models.BooleanField(default=False, verbose_name='邮箱验证状态')
    # 默认地址, on_delete=models.SET_NULL 删除时全部置换成空
    default_address = models.ForeignKey('Address', related_name='users',null=True, blank=True, on_delete=models.SET_NULL, verbose_name='默认地址')

    class Meta:
        db_table = 'tb_users'
        verbose_name = '用户'
        verbose_name_plural = verbose_name

    def generate_verify_email_url(self):
        """生成验证邮箱的url,将用户id和email封装在token中"""
        serializer = TJWSSerializer(settings.SECRET_KEY, expires_in=constants.VERIFY_EMAIL_TOKEN_EXPIRES)
        data = {'user_id': self.id, 'email': self.email}
        # 对data进行加密处理
        token = serializer.dumps(data).decode()
        verify_url = 'http://www.meiduo.site:8080/success_verify_email.html?token=' + token
        return verify_url

    @staticmethod
    def check_verify_email_token(token):
        """检查验证邮件的token,即检查用户是否存在"""
        # 解密
        serializer = TJWSSerializer(settings.SECRET_KEY, expires_in=constants.VERIFY_EMAIL_TOKEN_EXPIRES)
        try:
            data = serializer.loads(token)
        except BadData:
            return None
        else:
            email = data.get('email')
            user_id = data.get('user_id')
            try:
                user = User.objects.get(id=user_id,email=email)
            except User.DoesNotExist:
                return None
            else:
                return user


class Address(BaseModel):
    """用户地址"""
    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='addresses')
    title = models.CharField(max_length=20, verbose_name='地址名称')
    receiver = models.CharField(max_length=20, verbose_name='收件人')
    province = models.ForeignKey('areas.Area', on_delete=models.PROTECT, related_name='province_addresses', verbose_name='省')
    city = models.ForeignKey('areas.Area', on_delete=models.PROTECT, related_name='city_addresses', verbose_name='市')
    district = models.ForeignKey('areas.Area', on_delete=models.PROTECT, related_name='district_addresses', verbose_name='区')
    place = models.CharField(max_length=50, verbose_name='地址')
    mobile = models.CharField(max_length=11, verbose_name='手机')
    tel = models.CharField(max_length=30, null=True, blank=True, default='',verbose_name='固定电话')
    email = models.CharField(max_length=20, null=True, blank=True, default='', verbose_name='电子邮件')
    is_deleted = models.BooleanField(default=False, verbose_name='逻辑删除')

    class Meta:
        db_table = 'tb_address'
        verbose_name = '用户地址'
        verbose_name_plural = verbose_name
        ordering = ['-update_time']